MLQ}  X c0C)HCCH Mhhݩh `eCDiCD`  RyHW   * 1H0芢@) Y0.Ș`i#(PMRR\ \b Pgi 0  % @ / ՠ`d   0DDԝLH}QNbҩҢN \LP ZN)L:NҩGҭN)LXNҩǍҭ  ҩ NLxNNNҩ}ҭ  ҩZNLNNNҩҭN   dҩNҩ"NN) NNNN  dҩNҩ"NN)} NNNL_ Щ ,ɀ SL  ,L)  !`  ƙƯ`   }    XH `hɛ`8 X ``8L `0) ) ``4)} H h`` B VBDYEK J Vj8ii̅υΩ./8Ω̩˅͢ˑ }8Ω͠8a`ιaЍ)YYYYYυ̢ˑЍYYY TU }1i ` BD EHI VLP X)Y{ WX  WX dW dWE dW dWYY  }Y X dW dW dWкYYLP WX WXυ΅ XL˩͠X˹X͈$i }>Y&Y'YYY)Y  :ЍЩэЩ:ЩЩDLS  }&YUx)#i H0XXx)$HXʽXˈ'YUy)#i H0X}Xy)$HXʽX͈LSЭ&Y WΞYLVC?8  YUT80TLV808ULV CX yW&Ym'YMYmYDC}YY΢YYY΢YYLP WX WX X dWLPLPLSR˅ͅˢ ˈ˅ͥ`˅}ͅˠ˱ȑˈ˭˅ͥ``) `) `Yʈ0 dW dW dW dWLW`OY}ʈ0 dW dW dW dWLWF`  WX  ?X͠X͈э`  WX  ?XˠXˈ$9}`UT` BHI V`UTYY ` BHID E V`YY)  ?XYY  ?XYY)ߨ  }?X`<8zz8<>}xu" 888|D<^^<D|888"ux}> S:080 ̊) 0@press }#@option@ TANKS ? @@ -press @@ tie ROUND @ +Y?YFYZYnYYYYY[d]D_01234567890123}456789@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @ @@@@@ @@ @@ @ }@@ @ @@ @@ @@ @@ @@ @@ @@   @  @@  } @   @@ @@ @@ @@ @@ @@ @@ @ @@ @ } @@ @@ @@@@@ @ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ }@@@@@@@ @@@@@@@@@@@@@@@@@@ @ @@@@@ @@ @@ @@ !}@@ @@  @@  @@  @@  @@  @@ "}  @@  @@  @@ @@ @@ @@ #} @@ @@@@@ @ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@$}@@@@@@@ @ @@@@@ @@ @  @@ @@ @@ @@ %}@@ @@ @@ @@   @@   @@ @@ &}  @@  @@ @@ @@ @@ @@  @@ '} @@@@@ @ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@ @ @ (} @@@@@ @ @@ @ @@ @@ @@ @@ @@ @@ @@ @@ )}@@ @@ @@ @@ @@  @@  @@  @@  @@ @@ @@ @@ @@ *} @@ @@ @@ @@ @@ @@ @@ @@ @ @@ @ @@@@@ +} @ @ @@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@իիիիببШԪ +UժԨР$ZZ$,}U+ L$  6L$ H hL ؐ` ٰ եԄLQ Q SɈ򅙅 L.}NN >L$  6L$ H hL ؐ` ٰ եԄLQ Q SɈ򅙅 L!00 DISK A: DISK B: DISK C: DISK D: SIO2PC Remote Control ProgramPlease enter your command stringRun another comman0}d? (Y/N)Start with space to skip rerun promptCOMMANDS ARE:C - CREATE DISK ( Z for Dbl Dns) (DISK# 1 to 8, SIZE:1 to 5)L1} - LOAD 01FILE (DISK #) (PATHNAME)W - WRITE DISK TO FILE (DISK#) (P.NAME)S - SET COM PORT # (1 - 4)T - DISPLAY STATUS LI2}NEX - EXCHANGE DISKS (DISK#) (DISK#)R - RESTORE SCREEN MENUP - PRINTTHRU (XLT? 7 BIT? Y/N, P,S,F?)U - UNINSTALL DISKK - H}00 FILE2PC - REV. 1.1 by Nick Kennedy SIO2PC File transfer to PC ProgramSTANDBY 6 sec. - PC CREATING FILE Escap4}e key exits this programPlease enter the Atari filespecor press ESC to quit.Please enter the PC pathname for fileERROR in5} opening01 the Atari fileERROR in reading Atari fileERROR opening PC file.ERROR in SIO transferBAD STATUS from PC. Rest6}arting...FILE TRANSFER COMPLETEK:ERROR: 3 SEC DELAY AND RETRY0212D:P2K3 BIH V`HIB V` P2` 7} a28``Hh` 1 S`S @  S`  W 2`IH B8}D1E V`} P2 r2IH BD0E V r2IHL3G4 BD0E V r2 r2 r2IH 9}B+D0E V r2IH BqD0E V r2 B V1EDBJK V r2 r2 x2L6 r2IH B:}D0E VIH BD0E V r2L6BIH2D2H4C5E V r2 B V32:(42:! ;}2E0DBJK VL4 2E2DBJK V$IH BD0E V r2L3L6IH B<}ƝD0E V r2BIHD1E V 2$IH BUD1E V r2L3WD5?6   2 r2IH}README.DOC FOR REMOTE.OBJ ANDFILE2PC.OBJ.REMOTE.OBJ LETS YOU CONTROL SIO2PCFROM YOUR ATARI. IT IS A SMALL FILE,SO PUT IT >} ON THE RAMDISKS YOU ARELIKELY TO BE USING WHEN YOU WANTREMOTE CONTROL. TO USE, JUST RUNREMOTE.OBJ WITH DOS COMMAND "L" AN ?}DAT THE PROMPT, TYPE THE FULL COMMANDSTRING JUST LIKE YOU WERE DOING ITFROM THE PC. I RECOMMEND THAT YOU ENDTHE COMMAND S @}TRING WITH A SPACE. THEPC WILL CARRY OUT THE COMMAND, BUTCURRENTLY YOU WON'T BE NOTIFIED IFYOU'VE MADE AN ERROR.FILE2PC. A}OBJ LETS YOU TRANSFER ANATARI FILE TO A PC DISK FILE. THISMEANS YOU CAN USE YOUR PC WORDPROCESSOR TO READ IT, YOU CAN PRIN B}TIT THRU THE PC, ETC. ANYTHING YOUCAN DO WITH ANY OTHER PC FILE.TO USE THE PROGRAM, JUST RUN IT (ONYOUR ATARI) AND FOLLOW C} THE PROMPTS.THE PC GOES INTO A FILE TRANSFER MODEUNTIL FINISHED, OR YOU HAVE ANDERROR, OR PRESS ESCAPE ON THE PC.YOU FIR D}ST ENTER THE ATARI FILESPEC.NOTE: GIVE THE DRIVE SPEC, EVEN IFIT IS D1. LIKE THIS: D:TXTFILE.DOCTHEN YOU ENTER THE PC FIL E}ENAME ORPATHNAME, IF YOU DON'T WANT THEFILE IN THE CURRENT DIRECTORY. IDIDN'T EVEN REALIZE THAT THE ATARIHAD A BACKSPACE, F} BUT THERE IT IS,ABOVE THE PLUS SIGN: (\)I SHOULD HAVE ADDITIONAL DOC ONTHESE PROGRAMS IN YOUR PRINTEDINSTRUCTION AND IN G} DOC FILES ONTHE PC DISKETTE.NICK KENNEDY 5/4/90 HAVE ADDITIONAL DOC ONTHESE PROGRAMS IN YOUR PRINTEDINSTRUCTION AND IN 4LOCK DATA LINE12Hold START to hold this screenK:23` 2Э)` BIH V`HIB V` 2I}`8`) `2  2 S22 2L3`IH BD2E V` 2J}IH BD0E VR  22` 2 53 2I34H B D0E VR  2 2 53 2IH BK}D0E VR  2 2 53 2IH BD0E VR  2 2 53`R} 2 2IH BL}$D0E V 2IH BD1E V 2IH B45D0E V 2IH BD0E VIM}H B՝D0E VIH BD0E VIH BD1E VIH B=D1E VIH N}BXD1E VIH BpD1E VIH BD1E56 VIH BD1E VIH O}BӝD1E VIH BD1E V 2 T32EDBJK V 2 2IH BDD0E V 2P}IH BD0E V 2BIHD2E V 2W  2L6 662L6R  2 532 2 T3 2I}N@  )?HI Y0`HIJH) * J j * hJJJ )HJ h i     R} YS S0 i`ϣ߳ϣ߳H J3xj2hS} 1 |9 ӭ45(420 *(0241өX.`  R *i)Lvw  ~*PT}E 5 LN(G E  r s k rsrL ( E LO(0d( L iE0O +)$IC  H S8 U}q p h   j 8no CDLQ CFl M  LO Ri)Llk2'")*FV}$F$F$F$F$ 5 )ШF/Șl]kpqС,LQ/A! Ti)Zlk@ ܬ/i)(")")kW}$F$F$F 5$/L /lF@jj(LNkle$$%8(k()` R 8 ELO Ri)^>jf | NrC s X} ) vw5g   enfo Glvw LQ@iLm>j FL ~Jjjjii p qEhY}jlrs`LQ:$ȱ$@+[_#{ 8  Խut! ai 8   E I   ] CZ} H h    ˰ 8  N   Lm E  ,  [ `LQ ,/ 8 ~/  Ơ? ѩ[}/  [ /Lj0?MoLn FjMqLp NklLOLQnLoMlNLO R"(+\}ըHH`Q R!!  % !   / .   FȑF! /GF \H"+0+* ]}! F tLQnm: J~nTF1F  *n+)5! n (, n)1JJJn(n*o^} I ,0  ci a oF? @ , 8,0 ʩ0H Eh   i_}  D ]DmmFLQvtu`*&!*@h ] 0 ^0` c 0l$$%`}()()%*&J%H,@hH hH@,h $% 8i8$(%)0hhH ]h`() c 0H c 0 ha}`hhh&JJ ](ll  LQ0  /qnoHH 9 9 H H  I9  9 b} Nd EH  Q8 o n  FnoL HII/ Ih8`h`Lnon`no`u F c}E VEhLO/luF l0BF/lɜɛ׽hE N  b VFL FREE SECTORS Cd} H) *Fh ):FȽ F FC IH' 0 d  i:Fȩ/F.l`CD/08HDICe}IHȰ/F`ȱ$>.+.i ȱ$:刄H !A \ Hȱ$*?ȝ 2. ? [_{ ,0f}-:) 0$:>WI  IТ,LQH  0hLd ~ t u`C ?( 0(C.` E g} R =! .ti S0N EE D XC )0')AY  )ע ? 0E088FG \oh}n  (HhLcL3 iJ i Lqp 0=rspnqopqlk`jZj0  j FL`Hi}FhȑFȽlFi0 h FFLFpvqwgneofLF pq7  G0i 0 FJJh1FqȱFpȱFk`B!j}08`hEE D 8. =D}tui( TʩL`b!)    cȌaȌd b`aabk}H8 hdaHcd8 cH hHH  \h hc` =Hh I8ih( t  ( t(!` L\l}CJfCJfCJfCDfC` a  HII  INdh  `h  `n)8jHniPoijIjFIjFIjh` am} I 38  8H0 I  ' H LQ8j Y  8j NdY  &I &I &IHeH.pn}Iiq  `!.莿 2Jjj }.m Ȉ!m FG` ɩLQ z o} e Hi04 \ Ȍ  8 i h !`I0 `C Y8.`DOS SYSp} I  ` ~ݩ.C/`ba.m۩mѤC9 `C L] H  ,- '0 l q}, BLVDE`D1:AUTORUN.SYS8hhJ ȱHȱIȱBȱDȱEeeHHLV)  r}1*  ,,p-  0 I &  '0   Lw)l, 0  I&LD1:MEM.SAVs}E:D1:DUP.SYSE:D1:DUP.SYSE:D1:DUP.}J)1CD2:DOS.SYS n  * \*`آ R'S )ɀ@  U))% BError lou}ading MEM.SAV or memory!  0* b*c*d*e* R Hd*JSDd*J-=e* 0c*ʈд =}MYDOS 4v}.50 -- Copyright 1988,˛Disks 1S- 2S- D: = D1: ~= =1-8.Dir of D1:-D8: *. Dir of D:A. w}Disk Directory K. Save MemoryB. Run Cartridge L. Load MemoryC. Copy File(s) M. Run at AddressD. Delete File(s) N. Lx}oad MEM.SAVE. Rename File(s) O. Change Config.F. Lock File(s) P. Set DensityG. Unlock File(s) Q. Make DirectoryH. Wry}ite DOS Files R. Pick DirectoryI. Initialize Disk S. Set RAMdisk #J. Duplicate Disk V. Set Verify Flag  ?莼z}( 0  =Select Item ( for menu):@  =ɛL)1L,*L,:W@ ,,L=No such item!{}L*, -L*, BNeed new file name! BNo drive or director}}ies allowed in new name!Lock Unlock Delete Lock which file?â-#Unlock which file?ɢ-$((H @ AQ/wDel~}ete what file?Ѣ-!((H @ ANJ =Answer 'Y' or 'N'h `B L?;(( ~=( ~= =? =Y ?Lj.H @ AhR ?}R)L*,LM/L-Lz-File to rename, new name? @ A(9', ȱ:>0{ ПFull directory name?Z"L.Dire}ctory to be used as 'D:'? @ A(5)L.(I: ȱޝL*, BInvalid directory!L?( }(0Li-File source, destination? '( @C۩2ڭ82ܭC B9'0 @(ߍeލd(DЍ( ? 9'} A rBȱޙ':>Ȍ(C0J* .B :'ȱ/.* #,ɛȝ:' ߰ A L?,(0L*, '}ut(:'3?&' .'Ƚ:'?&'  .ى'Q?''(#( ~= =-->' ~=}Q =YR_o (J(  0?B݌''BK)`''utz0( >(L0L*,L?nDisk to FORMAT:} YA B(UTލ1 =(Press for Enhanced Dns)Type to Format Drive 3: =AIYZNj[R VL}?L*,D2:DUP.SYSDrive to write DOS files to? YAH1:*K)2J) Z wB hpJ) 2<2U}TC٩1ة۩کL;Source, Destination (Sectors)? YA)((9'( SA)((((( @(0% =Inser}t both disks, type = A( A((/( B(( BDrives not compatible!J(j(9'Hi''}h(ɛy BInvalid options! @-&& @)׍&&(&&&۩ک&&&&8* <4&&&& <4}8*8(ܭ(ݥ2C, BNot enough memory! ک&&`(Mh  & =L?&i &}&&&mm   =  &((&թԥԍ(Ս(((( ( ((C2((}ՠԍ((,(0"( (( =m(m( & &("L*,  ( AL4,(, =Insert DES}TINATION disk, press =Nͼ J) b( 0K) ?((ԭ(խ( ( (((L4Drive, new density:} YA9'ɛ BDrive unchanged.(ު90٨Ȍ(SD  ABL)xԌҭHӭ@ @ ʎӆ@}ӭ@@ :  $ӹ @hөԥX` Aˠ =RAM disk present? =NL#8 =xl}on or E type RAMdisk? =Aό  L   M A, A6: ' =No extra memory available!L#8L7 & & }& =Use default config for 0)ȩ ~= =K? =NL7 =Size(K)? ? @FjFjFjFj: =Page seq}uence? ? @o* =RAM disk drive no? = 09) `8 -8**H***) 9 Ȋ)h9 @@ʊ }H'h(#''/'(ɛ ? @(@: 3 ʽ' L7 =Duplicated sequence number!L7 =Wrong numb}er of entries!L7K큅쀄 =Verify WRITEs? ; =Number} of File Buffers? ? @  6 Lw),R( ';L*,Drive number or : =ɛLC99L60Ȍ( =Remove }drive? =Y =Is drive configurable? =YЂ =High capacity drive? =Yy =Is drive double sided? =Y ; =Tracks}/side? ? @#0M P( ; =Step rate? =4/ ; ';L*, =Drive size (in sectors)? ? @H(}h *;L*,RAM disk drive no? 8L*,Verify WRITEs? ;L*, =WNPy`(`(  LABSAVE:filename,start,end(,init(},run)) @TUH @Cp` 2< @؆8օڊ BInvalid START-END range!۩ @  @} hԄՠAμȌZ wB04*  0$ڍXۍY֍T׍U,0LBLB #CL?ֆ׌`Load MEM.SAV from wha}t file? 0#L*,L?Load from what file?) @TU&̩Z wB &0&-&а&𨭼INIZ'}RV0II BNO CARTRIDGE!Ԇխ  )L?Run from what address? ?ɛ @} BAddress must be 1-4 hex digits! BHILV n=`hh =HH` =0{a Hɛ n= n=h` n}=L*, = = pHH =hh`K: p `(((( i ɀ((L?(`(B'(0!HH''^}>I^>(`^>DH(` (HI`(o5 ~= =( B( >@A (J wB0x((HHIIDDE}E B ?(CɈK(٢A ~= =( BL>(B^>((ڤ ܝHݝI VL_>L?(" B !B J) } B(L& R XY( ?&:0H&((& ( .( & ( .(ʩ(}`ލD&ߍEBIʎH( V0`ԩ ؠ@ȱ@ȱ@ BError -- 120&`$8f 3AԄձG/ }$<68i/(Ԧ`H&եԦ&&eԅheԅԊe(iL*@&&&&ԅL*@B ? 3A?*(ɛ:}./2SX(0ȱ/.ɛ(ލ9'ި0#:Ȱ :ފ :ȱ: : CAD CAޥ}`(eޅީe߅`(` @L\A @TUȪ: BFile name not allowed!: )  i( =0+L }TUD BNot a disk file!(0` =Insert SOURCE disk, press =,(pӮ(A(O  1B AB1B} `9 % 1(L/ b(de BJKO L?O` B((*((}(`ȱޙ((:>Ȍ(`D:`OS.SYS,DOS.SYShh =L*,  VLJ C C,pLiLF#Խ٩Յ׆ } LB`((:>Ȍ(`D:`OS.SYS,DOS.SYShh =L*,  VLJ C C,pLiLF#Խ٩Յ׆  H BeD0E V 2)YL6 B V`+4 V 2W  2L6 662L6R  2 532 2 T3 2I7 BOD0E V 2 2 2$IH BUD1E V r2L3 BIHD1E V0bL6[Α10) r2I}H BD1E V䢴 2L511IH B D1E V r2 2L3 2$IH @66BUD1E V r2L3W}  H  2IH BwD1E VL3 2BIH BUD1E V r2IH BqD0E VL3W}  2L5 B V B V` 31E VL3 2BIH BUD1E V r2IH BqD0E VL3W(;; FILE2PC - REV. 1.1;; ATTEMPTING REVISION DUE TO BUG; REPORTS: 2/25/92; REVISING 3/23/92 DUE TO ERROR; SENDING} FILE: GOING TO ADD A RETRY; COUNTER AND 3 SECOND DELAY FOR; RETRIES: REV 1.1; A PROGROM TO TRANSFER A FILE FROM; THE AT}ARI TO THE PC VIA SIO2PC;; SIO2PC IS ADDRESSED AS DISK #$A; WHICH IS SIO BUS DEVID $3A; ORG $3000; TEXT S}TRINGS:TITLE1: DB ' FILE2PC - REV. 1.1',$9BTITLE2: DB ' by Nick Kennedy',$9bTITLE: DB ' SIO2PC File transfer to PC} Program',$9BSTNDBY: DB 'STANDBY 6 sec. - PC CREATING FILE',$9BESCEND:DB ' Escape key exits this program',$9bPMPT1: DB 'P}lease enter the Atari filespec',$9BPMPT1A: DB 'or press ESC to quit.',$9bPMPT2: DB 'Please enter the PC pathname for file'},$9BEOPF:DB 'ERROR in opening the Atari file',$9bEORF:DB 'ERROR in reading Atari file',$9bBADPC:DB 'ERROR opening PC fi}le.',$9bERSIO:DB 'ERROR in SIO transfer',$9bBSA:DB 'BAD STATUS from PC. Restarting...',$9bSUCESS:DB 'FILE TRANSFER COMP}LETE',$9BKSPEC: DB 'K:',$9BRETRY: DB 1TRIES: DB 1; USED TO RESET ABOVE COUNTERRT_DLY: DB 'ERROR: 3 SEC DELAY AND RETRY'},$9B; PLACE FOR RECORD:BUFFER: DS 128 ASSERT LOW BUFFER <> $FF ASSERT *-1 <> $FFPREFS:DB 'D:'; DEFAULT} DRIVEFSPC:DS 30; FOR ATARI FILESPEC; SUBROUTINES;PUTBYT: LDX #$B STX ICCOM LDX #0 STX IC}BLH STX ICBLL JSR CIOV RTS; HAVE IOCB*$10 IN X BEFORE CALLING; GETBYTE:GETBYT: LDA #0 S}TA ICBLL,X STA ICBLH,X LDA #7 STA ICCOM,X JSR CIOV RTSLINEFD: LDA #$9B JSR} PUTBYT RTS; SUBROUTINE TO SEE IF KEY HAS BEEN; PRESSED AND RETURN WITH CARRY SET; IF THE KEY IS 'ESCAPE' KEYBOAR}D MUST; BE OPEN VIA IOCB #1KEYCK:LDA CHCMP #$FFBEQ KOKYLDX #$10JSR GETBYTCMP #27 ; ESCAPE?BNE KOKYSECRTS}KOKY:CLCRTS; THIS SUB DELAYS # OF JIFFIES IN X REGPROCJIFFY:PHA:JIF1:LDA RTCLOK+2; INC'S EVERY 1/60:CHECK:CMP} RTCLOK+2BEQ :CHECKDEXBNE :JIF1PLARTSEPROC; SUBROUTINE TO SEND COMMAND TO PC; USER SET COMMAND 'W' OR 'R' T}O DCOMND; AND SECTOR # TO DAUX1 & DAUX2.; SEND RECORD TO SIO2PC:GOSIO: LDA #$A ; DISK $#A IS FILE XFR STA $30}1; FUNCTION. LDA #$80 STA $303 LDA #LOW BUFFER STA $304 LDA #HIGH BUFFER STA }$305 JSR $E453; DISKINVRTS; GET STATUS FROM SIO2PC:; RETURNS "NOT EQUAL" IF ERROR; NOTE: IT IS ASSUMED THAT ALL} VERSIONS; OF OS PUT STATUS AT 02EAGETSTAT:LDA #0STA $02EA; 1.1 - INITIALIZE SATAUSLDA #'S'STA DCOMNDLDA #$A ; D}ISK #$ASTA $301LDA #$40; MEANS "READ" DIRECTIONSTA $303LDA #4; LENGTH OF STATUS FRAMESTA $308LDA #0STA $309JS}R $E453LDA $2EA; GET FIRST STATUS BYTECMP #$10; $10 MEANS GOODRTS; NOT EQUAL MEANS ERROR; A SUBROUTINE TO TELL THE P}C THAT A; FATAL ERROR HAS OCCURRED AND IT ; SHOULD ABORT THE PROCESS. DAUX1 = 2; OF A SECTOR WRITE TELLS THE PC IT'S; ALL} OVER. SECTOR DATA IS IRRELEVANTSAYBAD:LDA #2STA DAUX1LDA #0STA DAUX2LDA #'W'STA DCOMNDJSR GOSIORTS; SUBR}OUINE TO PUT RECORD IN BUFFER TO; SCREEN:PTBUFF:PUTREC 0, BUFFERRTS; PROGRAMINIT: LDA #$FFSTA CHLDA #}125; CLEARJSR PUTBYT; SET COLORS TO LIGHT CHARS ON BLACK; BACKGROUNDLDA #8STA 709LDA #0STA 710JSR LINEFDPU}TREC 0, TITLE1JSR LINEFDPUTREC 0, TITLE2JSR LINEFDJSR LINEFDJSR LINEFDPUTREC 0, TITLEJSR LINEFDPUTREC 0, ESCE}NDJSR LINEFDCLOSE 1; READY TO OPEN KEYBOARD OPEN KSPEC, 4, 1START: JSR LINEFD JSR LINEFDJSR KEYCK; E}SCAPE ABORT?BCC KOK1JMP QUITKOK1:JSR LINEFDPUTREC 0,PMPT1; GET FILESPECPUTREC 0, PMPT1A; OR PRESS ESCAPE 1.0JSR L}INEFD;; WAIT FOR KEY OTHER THAN ESCAPE..ESKYLDA CHCMP #$1C; KYBD CODE FOR ESCBNE NT91JMP QUITNT91:CMP #$FFBEQ }ESKY GETREC 0, FSPC JSR LINEFD; NOW, OPEN THE ATARI FILE TO READ:CLOSE 2LDA FSPC+1CMP #':'BEQ YCO}LONLDA FSPC+2CMP #':'BEQ YCOLONOPEN PREFS, 4, 2JMP TESTOPYCOLON:OPEN FSPC, 4, 2TESTOP:BPL OKOPPUTREC 0, EOP}FJSR LINEFDJMP STARTOKOP:LDA CHCMP #$1C; KYBD CODE FOR ESCAPEBNE KKOK2JMP QUIT; GET PC PATHNAME FROM USER:KK}OK2:PUTREC 0, PMPT2JSR LINEFDGETREC 0, BUFFER; FIRST, GET PC'S STATUSGPCS:JSR GETSTATBEQ PCSOKPUTREC 0,BSAJS}R LINEFDJMP START; GET STATUS AGAIN; SEND IT TO THE PC ...PCSOK:LDA #'W'STA DCOMNDLDA #1STA DAUX1LDA #0STA D}AUX2JSR GOSIO; NOW, WAIT 6 SECONDS FOR PC TO CREATE; OR OPEN THE FILE...; REV. 1.0 CORRECTED LDA BELOW TO LDX; ADD "}STANDBY" MESSAGE:JSR LINEFDPUTREC 0, STNDBYLDX #255; 240 JIFFIES=4sJSR JIFFYLDX #127JSR JIFFYJSR GETSTATBEQ }PCOKPUTREC 0, BSAJSR LINEFDJMP START; NOW START PUTTING THE ATARI FILE TO; THE PC:PCOK:LDX #$20LDA #7; CMND FOR} GET BYTESSTA ICCOM,XLDA #0STA ICBLH,XLDA #$80; 128 BYTESSTA ICBLL,XLDA #LOW BUFFERSTA ICBAL,XLDA #HIGH BUFFE}RSTA ICBAH,XJSR CIOVBMI SHOPCPY #03; Impending EOF: OS PG. 79BEQ LAST1; REV 1.1JMP GMORESHOP:CPY #$88; MEANS E}ND OF FILEBEQ LAST1DEC RETRY; RETRY COUNTER - REV 1.1BMI NO_TRY; IF NOT NEG, RETRYJSR LINEFDPUTREC 0, RT_DLYLDX #}180; 3 SECOND DELAYJSR JIFFYJMP PCOKNO_TRY: LDA TRIES; RESET RETRY COUNTERSTA RETRYPUTREC 0,EORFJSR LINEFDJSR SA}YBADJMP STARTLAST1:JSR GETSTATBEQ LUST1PUTREC 0,BSAJSR LINEFDJMP STARTLUST1:LDA #'W'STA DCOMNDLDA #1; MEA}NS PARTIAL RECORDSTA DAUX1; AND DAUX2 HAS # OFLDX #$20 ; REV. 1.0 CHANGELDA ICBLL,X; BYTESSTA DAUX2JSR GOSIO}; ************** HANDLE ERRORS*******PUTREC 0,SUCESSJMP START;GMORE:JSR GETSTATBEQ GMIREPUTREC 0, BSAJSR LINEFD}PUTREC 0, ESCENDJMP STARTGMIRE:LDA #'W'STA DCOMNDLDA #0; MEANS FULL RECORDSTA DAUX1JSR GOSIO;*********** HAN}DLE ERRORS *********+JMP PCOK; GET NEXT RECORDQUIT: CLOSE 1CLOSE 2RTS; BACK TO DOS END INIT******* HANrF;; REMOTE; A PROGROM TO CONTROL THE PC's; SIO2PC PROGRAM FROM THE ATARI.;; SIO2PC IS ADDRESSED AS DISK #9;; RE}VISING 12/15/91 FOR REV 3.00 OF; SIO2PC; ADDED SCREEN COLOR CHANGE 2/28/92; ORG $3000; TEXT STRINGS:}RD1S:DB ' DISK A:',$9BRD2S:DB ' DISK B:',$9BRD3S:DB ' DISK C:',$9BRD4S:DB ' DISK D:',$9BTITLE: DB ' SIO2PC Remot}e Control Program',$9BPMPT1: DB 'Please enter your command string',$9BPMPT2: DB 'Run another command? (Y/N)',$9BPMPT3:DB} 'Start with space to skip rerun prompt',$9bINFO1:DB 'COMMANDS ARE:',$9BINFO2:DB 'C - CREATE DISK ( Z for Dbl Dns)',$9BI}NFO3:DB ' (DISK# 1 to 8, SIZE:1 to 5)',$9bINFO4:DB 'L - LOAD FILE (DISK #) (PATHNAME)',$9BINFO5: DB 'W - WRITE DISK TO F}ILE (DISK#) (P.NAME)',$9BINFO6: DB 'S - SET COM PORT # (1 - 4)',$9BINFO7:DB 'T - DISPLAY STATUS LINE',$9BINFO8:DB 'X - E}XCHANGE DISKS (DISK#) (DISK#)',$9BINFO9:DB 'R - RESTORE SCREEN MENU',$9BINFOA:DB 'P - PRINTTHRU (XLT? 7 BIT? Y/N, P,S,F?)}',$9BINFOB: DB 'U - UNINSTALL DISK', $9BINFOC: DB 'K - LOCK DATA LINE', $9BINFOD:DB 'Hold START to hold this screen',$9}BKSPEC: DB 'K:',$9BRETRY:DB 3; # OF RETRIES FOR GOSIO; PLACE FOR RECORD:BUFFER: DS 128ASSERT LOW BUFFER <> $FF; } SUBROUTINES; THIS SUBROUTINE DELAYS # OF JIFFIES; AS ARE FOUND IN X REGISTER:PAUSE:LDA RTCLOK+2PCHECK:CMP RTCL}OK+2BEQ PCHECKDEXBNE PAUSERTS;;WSTART - WAITS 3 SECONDS, THEN; IF START IS HELD, WAITS 3 MORE, ETC.WSTART:LDX} #180JSR PAUSELDA #8STA CONSOLLDA CONSOLAND #1BEQ WSTARTRTSPUTBYT: LDX #$B STX ICCOM LDX #0} STX ICBLH STX ICBLL JSR CIOV RTS; HAVE IOCB*$10 IN X BEFORE CALLING; GETBYTE:GETBYT: LDA} #0 STA ICBLL,X STA ICBLH,X LDA #7 STA ICCOM,X JSR CIOV RTSLINEFD: LDA #$9}B JSR PUTBYT RTS; SUBROUTINE TO WAIT FOR PC TO SIGNAL; READY TO SEND STATUS. CARRY SET; MEANS TIMED OUT}WASTAT:LDA #0STA $12; RTCLOCK MSBSTA $13STA $14; LSBCLOK:LDA $13CMP #4BNE NTOUT ; NOT TIMED OUTSECRTS; NOW}, HAS PC SIGNALED READY TO STATUS?NTOUT:LDA IRQST; CHECK PORT STATUSAND #%00100000; bit 5 is itBEQ CLOK; No data if b5} = 1LDA SERIN; to reset IRQSTCLCRTS; SUBROUTINE TO SEND COMMAND TO PC; USER SET COMMAND 'W' OR 'R' TO DCOMND; AND }SECTOR # TO DAUX1; SEND RECORD TO SIO2PC:GOSIO:LDA #3; 3 RETRIESSTA RETRYXGOSIO:LDA #0STA DAUX2 LDA #9; DI}SK #9 IS SIO2PC STA $301 LDA $80 STA $303 LDA #LOW BUFFER STA $304 LDA #HIGH }BUFFER STA $305 JSR $E453; DISKINVLDA $303; Get operation statusCMP #1; GOOD STATUSBEQ GUDSIODEC RETR}YLDA RETRYBEQ GUDSIO; IGNORE IF NO GUDLDX #255; AFTER 3 RETRIESJSR PAUSE; WAIT 4.25 SEC BEFOREJMP XGOSIO; RETRYGUD}SIO:RTS; SUBROUINE TO PUT RECORD IN BUFFER TO; SCREEN:PTBUFF:PUTREC 0, BUFFERRTS; SUBROUTINE TO GET AND PRINT DISK}; INFO FROM SIO2PC:;; IT ISSUES READ COMMANDS WITH DAUX1; SET FROM 1 THRU 4. SIO2PC RESPONDS; WITH A SECTOR FULL OF TEXT} FOR EACH; OF THE 4 DISK STRUCTURES, TERMINATED; IN $9Bs.GDSKIN:JSR LINEFDPUTREC 0, RD1SLDA #'R'STA DCOMNDLDA #1}STA DAUX1JSR GOSIOLDA RETRYBNE OKRTRYRTS; IF RETRIED OUT, QUITOKRTRY:JSR LINEFDJSR PTBUFFJSR LINEFDPUTREC }0,RD2SLDA #'R'STA DCOMNDLDA #2STA DAUX1JSR GOSIOJSR LINEFDJSR PTBUFFJSR LINEFDPUTREC 0,RD3SLDA #'R'ST}A DCOMNDLDA #3STA DAUX1JSR GOSIOJSR LINEFDJSR PTBUFFJSR LINEFDPUTREC 0,RD4SLDA #'R'STA DCOMNDLDA #4STA} DAUX1JSR GOSIOJSR LINEFDJSR PTBUFFRTS; PROGRAMINIT: LDA #1; MOVE LEFTMARG 1 LEFTSTA $52; CHANGE SC}REEN COLORS:LDA #8STA 709LDA #0STA 710LDA #125; CLEAR JSR PUTBYT JSR LINEFD PUTREC 0, TIT6} -Ӎөө ӍӢ B}HI V TRU 0? ƝѩҢ \ 9 %@H}@@ ԠABJBEDK V Ίɛ LՀHɛ  (I}hȘHLh ݊ O Ţܢs l~hɢҭʢҩ ҍƢxvXƢƢΖ L⃩ ,P!]I}2Э)J) k  Lȁ -ŢŢ ,- k-OƭR ƭ%ҩI}̭NQON󂫩 Ί ㊢.ɛ LL',0LPLLb  BL⃭ L⃭-ŢŢ,0LPpxI}̭v ŢŢ ɢҭʢҍ ҩX͢͢Ƣ,ƢPƢ-ŢŢ,ƢPǢҭȢҍ ҩƢ -ŢŢ,ƢPI}@ ŢŢ-ŢŢ,P,Ţ0pLbLx̭v ŢŢ ˢҭ̢ҍ ҩ҅X͢Ƣ,ƢPƢ-ŢŢ,ƢPI}ǢҭȢҍ ҩƢ -ŢŢ,ƢPƢ ŢŢ-ŢŢ,ƢP,ŢpLb0LƢ,0LpLb,ƢP%Ҭ͢-ŢŢI}͢Lȁ͢ܢ,ƭ0 ƭ (l l fL ٗȹȹL'G Ίɛ L.Rƭ I}LU ݊ QN L LƢh@Mh@xҍҩҩҩҍҍҍҩ7ҩ}X`U`ȭэͭ,I}0ͭ Laͭ!T˭xōXҭҭӭLU ,f dL ׆LԭǭǭέҭϭҐ ЭҭѭI }x{X ҩȭ ,,0̭U` ǭLxXҭҭӭҍ h@Hǭ4ͭ (ȭL!ȢI }Ǣҍ ҭSʭxXLЭㆭѭҰ έҭϭҍ x{Xhh@HʭLȭэͭ,0ͭCr,ͭI } ׆Lͭ ȭ,Lԭǭȭ,ǭLͭȢҭǢҍ ҭT˭xōXȭ,L, dLI }%LH˭L (L/,߇ȭ`ȭ`ͭͭ'ͭљȥҙȭȭȌI } Ί ㊢ɛ LAȹ/ȹ/ҩȭ`,ȭ҈ь0`mLEI}OH䈮刍刎䈭i@,P0 Ίɛ L҇ۈLE Ί ɛ LLEOH툭䈍刍戍爍I}戍 Ί ㊢ɛ L7Щ- -MBO6Щ-L8䈩刭툍戭爩OMI})+)++ ҍLֈ+܈׉hhh@8 THIS IS A TEST@ 퉥Rꈍ舥XYI}Xi஥YiᮥXiЍYi0ԩ1ԥ O Y l  Ί`HH䈮刍 ԍЎЩhh@HH ԍI}ЎЩhh@HH戮爍 ԍЎЩ͍hh@HH ؉ӊԍЎЩmhh@XiЅϩeYХYXieYXihI}eYeXeY`~HRȱψSL/h`SȑψR`'ψ`h恈Ɓ`@慈ƅ``~I}R`` HS0hȌ`SRȱSSSh`'ԊϋR``8` 舑舥Sꈐ`ꈭI}(舥R鈩`술(눱숑눬x8(舩`x X ɭȭ̭RI}舩``xɭɭɭX`X0!R舩`Ћˌ`興'SLߋSꈩ舑`ݮ͎I}ޮ͏ L+,L`ݮޮ  λκ`?ɡɻ[~}I}L1` "ͻ ͺ Q`஍ᮍ Ί ݊ŘǍƭ QN `殩/0I}1```͏͎`ݮޮ ݮ+i@⮩mޮ㮭ޮI},`{% !HUiPch T ]T `L} l] TRU`ɛ RUT LȍÎ~RU T` ` TI}T `T T ``TݢUޢ`ݢTޢU`HTHUH} uOɛT+ u+I}ߌ+ЭЪ))} u+LL} uhUhTh ^` LS LLL) ΊߢɛĎ L ^LŐ 0EDI}BJK V& ΊLɛ Lɛ L Lx0 BLDEIH V& Ίtɛ LAɛ LQI}Lx Ίɛ Lg %L< Ίߢɛ L ^LŐ 0EDBJK V& ΊLɛ LďI}ɛ LԏL>0BLDEIH V& Ίɛ L ɛ LL> Ίɛ L0 U RI`R kI } % 9L}STATUS COMMANDJSR WASTAT; WAIT FOR PC READYBCC :NC1; Carry clear = OK.JMP DECIDE;GET AND PRINT STATUS OF COMMAND:?}NC1LDA #'R'; GET DATASTA DCOMNDLDA #5; 5 MEANS GET STATUSSTA DAUX1JSR GOSIOJSR PTBUFF; GET AND PRINT NEW DISK IN@}FONOSTAT:NOPDECIDE:LDA BUFFER; Is first char space?CMP #' 'BEQ QUIT; If so, no promptJSR GDSKINJSR LINEFD A} PUTREC 0,PMPT2 LDX #$10; IOCB 1 = K: JSR GETBYT AND #%11011111; FORCE UPPERCASE CMP #'Y' B} BNE QUIT JMP STARTQUIT: CLOSE 1 RTS; BACK TO DOS END INIT UPPERCASE CMP #'Y' _SPACE2;Operating System Equates ------------------------; THIS FILE IS CHANGED FOR USE BY; SIO2PC UTILITIES...SPAC!D}E1; SIO EQUATES:SERINEQU$D20EDDEVICEQU$300DUNITEQU$301DCOMNDEQU$302DSTATSEQU$303DBUFLOEQU$304DBUFHIEQU!E}$305DTIMLOEQU$306DBYTLOEQU$308DBYTHIEQU$309DAUX1EQU$30ADAUX2EQU$30BDSKINVEQU$E453WSYNCEQU$D40ACOLPF1!F}EQU$D017COLPF2EQU$D018COLBKEQU $D01ACOLOR1EQU$2C5COLOR2EQU$2C6COLOR4EQU$2C8; BackgroundNMIENEQU$D40E; b7/DL!G}I b8/VBIVDSLSTEQU$200; NMI OS vectorDOSVECEQU$000A;this program's start vectorDOSINIEQU$000C;this program's init v!H}ectorPOKMSKEQU$0010;mask for POKEY IRQ enableRTCLOKEQU$0012;60 Hz clockVIMIRQEQU$0216;immediate IRQ vectorSSKCTL!I}EQU$0232;serial port controlMEMLOEQU$02E7;start of user memoryCHEQU$02FC;character bufferICCOMEQU$0342;CIO com!J}mand blockICBALEQU$0344ICBAHEQU$0345ICBLLEQU$0348ICBLHEQU$0349ICAX1EQU$034AICAX2EQU$034BCIOVEQU$E456;CI!K}O request vectorSETVBVEQU$E45C;system interrupt init vectorXITVBVEQU$E462;system VBLANK return handler;Hardware Reg!L}isters --------------------------------SPACE1CONSOLEQU$D01F;console key registerAUDF1EQU$D200;audio channel 1 fre!M}quencyAUDC1EQU$D201;audio channel 1 controlAUDCTLEQU$D208;audio controlSTIMEREQU$D209;start timerIRQENEQU$D20E!N};IRQ enable maskIRQSTEQU$D20E;IRQ statusSKCTLEQU$D20F;serial port controlPORTAEQU$D300;port ANMIRESEQU$D40F;!O}NMI resetNMISTEQU$D40F;NMI statusAUDF4EQU$D206AUDC4EQU$D207AUDC2EQU$D203AUDC3EQU$D205AUDF3EQU$D204AUDF2E!P}QU$D202PACTL: EQU $D302; Floating point locations:;INBUFF: EQU $F3CIX: EQU $F2FR0: EQU $D4FASC: EQU $D8E6IF!Q}P: EQU $D9AAFPI: EQU $D9D2FADD: EQU $DA66FSUB: EQU $DA60 ; FR0-FR1=FR0FMUL: EQU $DADBFDIV: EQU $DB28 ; FR0!R}/FR1=FR0FLD0R: EQU $DD89 ; X=L, Y=MSB to FR0FLD1R: EQU $DD98 ; same, load FR1FSTOR: EQU $DDA7 ; same, store FR0FMOVE: !S} EQU $DDB6 ; Move FR0 to FR1AFP: EQU $D800 ; ASCII to FP (FR0);; This MACRO puts a record. The ; parameters are IOCB #!T} and; address of RECORD.;PUTREC: MACRO I, ALDX #%1*$10LDA #0STA ICBLH,XLDA #$80STA ICBLL,XLDA #9STA ICCOM,X!U}LDA #LOW %2STA ICBAL,XLDA #HIGH %2STA ICBAH,XJSR CIOVENDM;;; This MACRO puts the bytes of a ; record, but not !V}the EOL. EOL is; required for a delimiter.;PUTBTS: MACRO I, ALDX #%1! LDA #0! TAYSTA $348,X! STA $349,XLDA #HIGH %2!!W} STA $345,XLDA #LOW %2! STA $344,XLDA #$B! STA $342,X?L%K: LDA %2,YCMP #$9B! BEQ ?D%KINC $348,X! INY! BNE ?L%K?D%!X}K: JSR CIOVENDM;; This MACRO puts bytes to my handler; The bytes must end with EOL ($9b); which is not sent. The byte!Y}s are; carried in A. ADR is adr of the; data, MY is the adr (Name) of my; handler.;PBMYMACRO ADR, MYLDX #0?O%KLDA %!Z}1,XCMP #$9BBEQ ?E%K + 3JSR %2INX?E%KJMP ?O%KENDM; A MACRO to put a specified number; of bytes to an IOCB channe![}l:; QTY is the absolute number of bytes; to put.; Channel, Quantity, AddressPUTQTYMACRO C, Q, ALDX #%1*$10LDA #$B!\}STA ICCOM,XLDA #LOW %3STA ICBAL,XLDA #HIGH %3STA ICBAH,XLDA #HIGH %2STA ICBLH,XLDA #LOW %2STA ICBLL,XJSR C!]}IOVENDM; Now, we do the same for GET bytes:; PARAMETERS: CHANNEL, QTY, ADDRESSGETQTYMACRO C, Q, ALDX #%1*$10LDA !^}#7STA ICCOM,XLDA #LOW %3STA ICBAL,XLDA #HIGH %3STA ICBAH,XLDA #HIGH %2STA ICBLH,XLDA #LOW %2STA ICBLL,XJS!_}R CIOVENDM; Parameters: IOCB, ADDRESSGETRECMACRO I, ALDX #%1*$10LDA #5STA ICCOM,XLDA #0STA ICBLH,XLDA #$80!`}STA ICBLL,XLDA #LOW %2STA ICBAL,XLDA #HIGH %2STA ICBAH,XJSR CIOVENDM; DINC.MAC; This is a MACRO file to i!a}ncrement; two bytes (LO/HI) stored at its; argument (ADR of the lower byte); PARAMETER: ADDRESSDINCMACRO AINC %1BNE!b} ?%KAAINC %1+1?%KAAEQU *ENDM;DDEC; This MACRO decrements a two byte; value as above. A is affected.; PARAMETER: !c}ADDRESSDDECMACRO ADEC %1LDA %1CMP #$FFBNE ?%KABDEC %1+1?%KABEQU *ENDM; File OPEN.MAC; Some misc CIO!d} actions:; DVSPEC is adr. of filespec, in ; ATASCII, ending in EOL. DIR is 4; for read, 8 for write. IOCB is ; IOCB # (n!e}ot times $10) ICAX2 may; need to be <>0 for spcl modes; Parameters: FILESPEC, DIR, IOCBOPENMACRO S, D, ILDX #%3*$10!f}LDA #HIGH %1STA ICBAH,XLDA #LOW %1STA ICBAL,XLDA #3STA ICCOM,XLDA #%2STA ICAX1,XLDA #0STA ICAX2,XJSR CIOV!g}ENDM; A MACRO to close an IOCB channel:CLOSEMACRO IOCBLDX #%1*$10LDA #$CSTA ICCOM,XJSR CIOVENDMJSR CIOV uBB+TANK OBJB/REMOTE OBJB3FILE2PC OBJB =README DOCB#QDOS SYSB6tDUP SYSB0FILE2PC SORB,REMOTE SORB%CSYSTEXT <XMTSIO OBJ DRECVSIO OBJ=OTALKPIA SORTALKPIA OBJ\RCVPIA SOR RCVPIA OBJSYSTEXT PIAKXMTPIA SOR-OATARICOMDOCBbKEYER OBJR PUTBYT ; No? Print it! JMP RCV ; and get another.;;RINIT: LDA #$FF ; Not ready. STA PORTA LDA #-r}$9B JSR PUTBYT PRINTS MSG1 LDA #LOW CTLDD ; Make PORTA STA PACTL ; be data direction -s}LDA #%00000100 ; register. STA PORTA ; Made bit 2 input. LDA #LOW CTLRW ; Make PORTA STA PACTL ; be I-t}/O port again RTS;;; Wait for console button routine:;WAIT: LDA CONSOL AND #7 ; 3 lo bits only. -u} CMP #7 BEQ WAIT RTS;; This subroutine receives a byte:;RLOOP: LDA PORTA ; XMT initialized? AND-v} #3 ; Get bits 0 and 1 CMP #2 ; Data LO & DR HI? BNE RLOOP ; Keep checking LDA #7 ; Bit counter (0-7)-w} STA BITCTRLP3: LDA #$FF - 4 ; clear bit 2 STA PORTA ; (set RR ready)RLP1: LDA BITCT ; We don't time ou-x}t CMP #7 ; if waiting for the BEQ SEVEN ; first bit. LDA RTCLOK ; But check on CMP TIMER ; la-y}ter bits BNE NOTO ; No timeoutGOON: PRINTS TOM ; timeout message PLA ; Clear return address PLA ; -z}from stack. JMP INIT1 ; Goto menuSEVEN: LDA RTCLOK ; Set up timer for STA TIMER ; one to two jiff's -{} INC TIMER INC TIMERNOTO: LDA PORTA ; check DR AND #2 ; Mask all but DR line BNE RLP1 ; DATA not r-|}eady ASL DATA LDA PORTA ; Read data AND #1 ; Mask non-data CLC ADC DATA ; add it to D-}}ATA STA DATA LDA #$0F STA PORTA ; RR not readyRLP2: LDA TIMER CMP RTCLOK BEQ GOON -~}; Go on. (exit) LDA PORTA ; Check for DR not. AND #2 BEQ RLP2 ; DR not set DEC BITCT ; Next -}bit BPL RLP3 ; Do 8 bits LDA DATA ; Take it home RTS;;; This subroutine sends a byte out; over th-}e PIA line:;TLOOP: STA DATA ; Store the byteTLP4: LDA PORTA ; Check rcvr status AND #4 BEQ TLP4 ; Loop -}if ready. LDA #2 ; Set DR=1, DATA=0 STA PORTA LDA #7 ; Bit counter STA BITCT ; initialize-} LDA RTCLOK STA TIMER INC TIMER INC TIMERTLP1: LDA RTCLOK ; Check for time CMP TIME-}R ;waiting for RR. BNE TLP5 ; No timeoutTGOON: PRINTS TOM ; timeout message PLA ; Clear return address -} PLA ; from stack. PLA ; Also clear data byte. JMP INIT1 ; Goto menuTLP5: LDA PORTA ; Receiver ready? -} AND #4 ; Bit 2 is RR line BNE TLP1 ; Not ready ASL DATA ; Knock left bit LDA #0 ; Into carry -} ADC #0 ; add carry to 0 STA PORTA ; Put data/DR readyTLP2: LDA TIMER CMP RTCLOK BEQ TGOON ;-} Timed out LDA PORTA ; RCVR accept data? AND #4 ; RR line set? BEQ TLP2 ; Not yet LDA #$0F ; -}Data not ready. STA PORTA ; Tell RCVR DEC BITCT ; Count the bit BPL TLP1 ; 8 bits sent? RTS;-} Subroutine to put record to E:; (Have ICBAH/L loaded before entry);PUTREC: LDA #$80 STA ICBLL LDX #0 -} STX ICBLH LDA #9 ; Put record. STA ICCOM JSR CIOV RTS;; Subroutine to put byte to E:-}; (Have byte in accumulator on entry);PUTBYT: LDX #$B ; Put byte STX ICCOM LDX #0 STX ICBLH -} STX ICBLL JSR CIOV RTS;; TRANSMIT section follows:;TINIT: LDA #$0F ; Not ready/Not init STA PO-}RTA PRINTS MSG2 LDA #LOW CTLDD STA PACTL ; Data direction LDA #%00000011 STA PORTA -} LDA #LOW CTLRW STA PACTL ; Data register LDA #$FF STA CH ; Clear keyboard RTS;; A ro-}utine to get one byte from ; IOCB #0 (assumed to be E:):;GETBYT: LDX #0 STX ICBLL STX ICBLH LDA #7-} STA ICCOM ; Get bytes. JSR CIOV RTS;; OPEN KEYBOARD, IOCB #1;OPENK: LDX #$10 LDA #3 -} STA ICCOM,X LDA #4 ; Read STA ICAX1,X LDA #HIGH KYBD STA ICBAH,X LDA #LOW KYBD -} STA ICBAL,X JSR CIOV RTSCLOSK: LDX #$10 ; Close it. LDA #$C STA ICCOM,X JSR -}CIOV RTS;GETK: LDX #$10 ; Get one byte from LDA #$7 ; keyboard. STA ICCOM,X LDA #0 -} STA ICBLL,X STA ICBLH,X JSR CIOV RTS; END INIT; TA ICCOM,X LDA #0 ,_@APRESS START FOR RECEIVEPRESS SELECT FOR TRANSMITNOW IN RECEIVE MODE.TRANSMIT MODE; "CONTROL-A" to RECEIVEPRESS OPTI1}ON TO EXITTRANSMIT CONTROL-D FOR MENUTIMED OUT DURING BYTE TRANSFERK:TRANSMITTER HAS EXITED PROGRAM} Bө B B1}@EDAA B B@ED B B@ErD B B@ED B B B A*` B "CH >Bh} BL@ BL1}VA A A B@EōD BL@ BLwAө B@E7D B8өө<`)`)@ӭ@@1}@ED BhABhL@@@@)@)m@@ӭ@)@@`@)ө@@@@@@E1}D BhhhL@)@iӭ@խ)@`HI B V` BIH V`ө@ELD B8өө<1}ө`HIBB4C V`BJ@ED V` B V`BHI V`@V`ө@ELD B8өө<0Z; RECEIVE;; Nick Kennedy;; 11/15/86;; This program is intended to receive; and run binary fi5}les via the ; joystick (PIA) port.;; This part of the program creates ; the cassette boot file.;NORECS: EQU [RECORD-STA5}RT+127]/128FLEN: EQU NORECS*128; ORG $4000; PROCCASFN: DB 'C:', $9BRUNCS: LDX #$40 ; IOCB #4 5} LDA #3 ; Open STA ICCOM,X LDA #HIGH CASFN STA ICBAH,X LDA #LOW CASFN STA ICBAL,X 5} LDA #8 STA ICAX1,X LDA #%10000000; Short IR gaps STA ICAX2,X JSR CIOV BPL :OK1 5} STY $600 RTS;; Now, put the entire file:;:OK1: LDX #$40 LDA #$B STA ICCOM,X LDA 5}#HIGH STRT STA ICBAH,X LDA #LOW STRT STA ICBAL,X LDA #HIGH FLEN STA ICBLH,X L5}DA #LOW FLEN STA ICBLL,X JSR CIOV BPL :OK2 STY $600 RTS;:OK2: LDA #$C ; Close IOC5}B STA ICCOM,X JSR CIOV BPL :OK3 STY $601;:OK3: RTS ; Back to DOS;EPROC;; System Equa5}tes:CH: EQU $2FC ; Keyboard code hereCIOV: EQU $E456ICCOM: EQU $342ICBAL: EQU $344ICBAH: EQU $345ICBLL: EQU $5}348ICBLH: EQU $349ICAX1: EQU $34AICAX2: EQU $34BRTCLOK: EQU $14BEEP: EQU $FDCONSOL: EQU $D01FZLOAD: EQU $CB ; Z-5}page pointer L=2;STRT: LOC $700 ; Cassette start;; Put Cassette header bytes:;LDADR: DB $FF, LOW NORECS, LOW LDADR,5} HIGH LDADR; DB LOW INIT1, HIGH INIT1; Refer. to OS manual pg 166 and; De Re Atari pg c-7/8:;START: LDA #$3C ; 5}Off motor STA $D302 ; (PACTL) LDA #LOW [RECORD+1] STA $237 ; (MEMLO) STA $E ; (APPMHI) 5} LDA #HIGH [RECORD+1] STA $238 STA $F LDA #LOW INIT STA $A ; (DOSVEC) LDA #HIGH INIT5} STA $B ; (DOSVEC) CLC ; indicate boot success RTS ; End of init.INIT1: RTS ; No boot continuation.5}ENDL: DS 1ENDH: DS 1PLACE: DS 1TIMER: DS 1 ; My timeout timerFLAG: DS 1 ;;; STRINGS:KYBD: DB 'K:5}',$9BPMPT1: DB 'Input Filespec. Example: D2:FILE',$9BBSTMSG: DB 'Bad status on opening file.', $9BNTLF: DB 'Header err5}or - not a load file.', $9B; INITIALIZE;INIT: LDA #0 ; Clear Run/Init adr. STA $2E0 STA $2E15} STA $2E2 STA $2E3 JSR OPENK LDA #$9B JSR PUTBYT LDA #$9B JSR PUTBYT 5} PRINTS PMPT1 LDA #$9B JSR PUTBYT;; Stash cursor position:; LDA $54 PHA LDA 5}$55 PHA LDA $56 PHAGETRK: JSR GETK CMP #$9B BEQ GREC JSR PUTBYT JMP5} GETRKGREC: PLA STA $56 PLA STA $55 PLA STA $54 LDA #$1F ; CURSOR right 5} JSR PUTBYT LDA #$1E ; left JSR PUTBYT LDA #13 STA ICAX1 ; Forced read LDA #HIGH5} RECORD STA ICBAH LDA #LOW RECORD STA ICBAL JSR GETREC ; Get filename. PRINTS RECORD 5}; Echo it. LDA #12 STA ICAX1 JSR CLOSK ; Close #1.;; Send the filespec to the other 800:; 5}PROC JSR TINIT LDY #0:LOOP: LDA RECORD,Y ; Get byte JSR TLOOP ; Send it LDA RECORD,Y ; agai5}n to check CMP #$9B ; For EOL BEQ :DUN INY ; Next byte BNE :LOOP ; Forced branch;; Get read5}y to receive acknowledge:;:DUN: JSR RINIT JSR RLOOP ; Get status BNE :GOOD PRINTS BSTMSG 5}JMP INIT:GOOD: JSR RLOOP ; check header byts CMP #$FF BNE :BADHD JSR RLOOP CMP #$FF 5} BEQ :GDHD:BADHD: PRINTS NTLF ; Not load file JMP INIT:GDHD: JSR RLOOP ; Get load address STA LOAD+1 5} STA $605 ;********** STA $607 JSR RLOOP STA LOAD+2 STA $606 ;*********** STA $6085} JSR RLOOP ; Get end address STA ENDL JSR RLOOP STA ENDH:RBYTE: LDY #0 ; Dummy index. 5} JSR RLOOP ; Get file byte.LOAD: STA RECORD ; (Dummy address) LDA LOAD+2 CMP ENDH BNE :NOTEQ 5} LDA LOAD+1 CMP ENDL BNE :NOTEQ JMP :SEGDUN ; Segment done:NOTEQ: INC LOAD+1 ; Increment load 5} INC $607;************** BNE :RBYTE ; address. INC LOAD+2 INC $608 ;************** JMP :RB5}YTE:SEGDUN LDA $2E2 ; Check init adr. BNE :INIT ; No init if = 0. LDA $2E3 BEQ :RDY:INIT: LDA $2E25} ; (:INIT, not INIT) STA :GO+1 ; Set up JSR adr LDA $2E3 STA :GO+2:GO: JSR HELL ; HELL is dummy A5}DR.:RDY: JSR JIF2 ; Stall 2 jiffies JSR TINIT JSR TLOOP ; Send any byte. JSR RINIT JSR RLO5}OP ; EOF? BEQ :RUN ; Yes JMP :GDHD;:RUN: LDA $2E0 BNE :DORUN LDA $2E1 BNE :DORUN5}:RUNN: JSR HECK ; HECK is a dummy:DORUN: LDA $2E0 ; if there's a run STA :RUNN+1 ; address, else LDA $2E1 ;5} we restart. STA :RUNN+2 JMP :RUNN RTS ; In case it comes back EPROC;; JIF2: Stall 2 jiff5}ies waiting to; be sure the other guy gets into; receive mode.;JIF2: LDA RTCLOK STA PLACE INC PLACE 5} INC PLACEJIF2A: LDA RTCLOK CMP PLACE BNE JIF2A RTS;JIF10: LDA RTCLOK ; waste 10/60 sec. 5} ADC #$A STA PLACEJIF10A: LDA RTCLOK CMP PLACE BNE JIF10A RTS;; Subroutine to put reco5}rd to E:; (Have ICBAH/L loaded before entry); (Use MACRO PRINTS);PUTREC: LDA #$80 STA ICBLL LDX #0 5} STX ICBLH LDA #9 ; Put record. STA ICCOM JSR CIOV RTS;; Subroutine to get a record from #5}0; User set ICBAL/H.;GETREC: LDX #0 LDA #5 STA ICCOM LDA #$80 STA ICBLL STX ICBLH5} JSR CIOV STY $600 RTS;;; Subroutine to put byte to E:; (Have byte in accumulator on entry);PUTB5}YT: LDX #$B ; Put byte STX ICCOM LDX #0 STX ICBLH STX ICBLL JSR CIOV RTS;;5}; A routine to get one byte from ; IOCB #0 (assumed to be E:):;GETBYT: LDX #0 STX ICBLL STX ICBLH 5}LDA #7 STA ICCOM ; Get bytes. JSR CIOV RTS;;; OPEN KEYBOARD, IOCB #1;OPENK: LDX #$10 LD5}A #3 STA ICCOM,X LDA #4 ; Read STA ICAX1,X LDA #HIGH KYBD STA ICBAH,X LDA #LO5}W KYBD STA ICBAL,X JSR CIOV RTSCLOSK: LDX #$10 ; Close it. LDA #$C STA ICCOM,X 5} JSR CIOV RTS;GETK: LDX #$10 ; Get one byte from LDA #$7 ; keyboard. STA ICCOM,X LDA5} #0 STA ICBLL,X STA ICBLH,X JSR CIOV RTSHELL: PRINTS NOINI ; INIT =0 PLA ; We shou5}ldn't be here. PLA JMP INITHECK: PRINTS RUNZRO ; RUN = 0 PLA ; We shouldn't be here PLA 5} JMP INITNOINI: DB 'Went to INIT with INIT=0; ERROR!', $9BRUNZRO DB 'Went to RUN but RUN = 0; ERROR!', $9B;;; Th5}e following is the transmit/; receive portion of TALKP.;; System Equates:PACTL: EQU $D302;CTLRW: EQU %00111100 ; to R5}/W portCTLDD: EQU %00111000 ; to write data; direction. (0=input; 1=output);PORTA: EQU $D300;; For STICK 0, bits 0-3 5}equal pins; 1-4. (8 is ground);; PINS:;;; 1 2 3 4 5 ; View of jack on; 6 7 8 9 ; console.;; NOTES:;; Pin5} 1 is data.; Pin 2 is Transmitter status.; (DATA READY or DR) (0 = READY).; Pin 3 is Receiver status.; (RECEIVER READY or5} RR) (0 = READY).;; Initialization: Before each byte; sent/received all out lines are ; made high. Transmitter makes sure5}; RR is high, then sets DATA lo. ; Receiver watches for DR high AND; Data lo, then is freed to set RR; lo (ready). Transm5}itter is then; free to put data and set DR lo (rdy);;;DATA DS 1 ; Store/send byte hereBITCT: DS 1 ; Bit counter;;5} STRINGS:TOM: DB 'TIMED OUT DURING BYTE TRANSFER', $9B;; INITIALIZE;;RINIT: LDA #$FF ; Not re5}ady. STA PORTA LDA #$9B JSR PUTBYT LDA #LOW CTLDD ; Make PORTA STA PACTL ; be data di5}rection LDA #%00000100 ; register. STA PORTA ; Made bit 2 input. LDA #LOW CTLRW ; Make PORTA 5}STA PACTL ; be I/O port again RTS;; This subroutine receives a byte:;RLOOP: LDA PORTA ; XMT initialized? 5} AND #3 ; Get bits 0 and 1 CMP #2 ; Data LO & DR HI? BNE RLOOP ; Keep checking LDA #7 ; Bit counter (5}0-7) STA BITCTRLP3: LDA #$FF - 4 ; clear bit 2 STA PORTA ; (set RR ready)RLP1: LDA BITCT ; We don't tim5}e out CMP #7 ; if waiting for the BEQ SEVEN ; first bit. LDA RTCLOK ; But check on CMP TIMER 5}; later bits BNE NOTO ; No timeoutGOON: PRINTS TOM ; timeout message PLA ; Clear return address PL5}A ; from stack. JMP INIT ; Goto menuSEVEN: LDA RTCLOK ; Set up timer for STA TIMER ; one to two jiff's 5} INC TIMER INC TIMERNOTO: LDA PORTA ; check DR AND #2 ; Mask all but DR line BNE RLP1 ; DATA no5}t ready ASL DATA LDA PORTA ; Read data AND #1 ; Mask non-data CLC ADC DATA ; add it t5}o DATA STA DATA LDA #$0F STA PORTA ; RR not readyRLP2: LDA TIMER CMP RTCLOK BEQ GO5}ON ; Go on. (exit) LDA PORTA ; Check for DR not. AND #2 BEQ RLP2 ; DR not set DEC BITCT ; Ne5}xt bit BPL RLP3 ; Do 8 bits LDA DATA ; Take it home RTS;;; This subroutine sends a byte out; over5} the PIA line:;TLOOP: STA DATA ; Store the byteTLP4: LDA PORTA ; Check rcvr status AND #4 BEQ TLP4 ; Lo5}op if ready. LDA #2 ; Set DR=1, DATA=0 STA PORTA LDA #7 ; Bit counter STA BITCT ; initiali5}ze LDA RTCLOK STA TIMER INC TIMER INC TIMERTLP1: LDA RTCLOK ; Check for time CMP T5}IMER ;waiting for RR. BNE TLP5 ; No timeoutTGOON: PRINTS TOM ; timeout message PLA ; Clear return address 5} PLA ; from stack. PLA ; Also clear data byte. JMP INIT ; Goto menuTLP5: LDA PORTA ; Receiver ready?5} AND #4 ; Bit 2 is RR line BNE TLP1 ; Not ready ASL DATA ; Knock left bit LDA #0 ; Into carry5} ADC #0 ; add carry to 0 STA PORTA ; Put data/DR readyTLP2: LDA TIMER CMP RTCLOK BEQ TGOON5} ; Timed out LDA PORTA ; RCVR accept data? AND #4 ; RR line set? BEQ TLP2 ; Not yet LDA #$0F 5}; Data not ready. STA PORTA ; Tell RCVR DEC BITCT ; Count the bit BPL TLP1 ; 8 bits sent? RTS5};; TRANSMIT section follows:;TINIT: LDA #$0F ; Not ready/Not init STA PORTA LDA #LOW CTLDD STA 5}PACTL ; Data direction LDA #%00000011 STA PORTA LDA #LOW CTLRW STA PACTL ; Data register 5} RTS;; RECORD is where I input my filename; It takes no file space cause it's ; at the end;OEND: EQU *ORECORD: E5}ND RUNCS; s where I input my filename; It takes no file space cause it's ; at the end;OEND: EQU *ORECORD: E4@|@C:@B@EDJK V`@ B@EYDIH V` B V` #<ө7 8 9} ``@}AK:Input Filespec. Example: D2:FILEBad status on opening file.Header error - not a load file. Y 9} 7 7 E,D  7 THUHVH ~ ɛ 7 LhVhUhT 7  7 J ED ! ED  J s    ɛ9}  1 ~AyBEND  L 1  1 EjD  L 1 | 1 } 1 $ 1 % 1  }% |$L9}|}Lv    1 LR L`&&&&`i &&`9}HI B V`zBNCBHI V` BIH V`HIB V`BJE)D V` B V`B9}HI V` ED  hhL E֍D  hhLWent to INIT with INIT=0; ERROR!Went to RUN but RUN = 0; ERROR!QCLDTIMED OUT D9}URING BYTE TRANSFERө 7 8өө<`) ӭ ' ED  hhL''') )m:} ӭ')  ` )ө '''' ED  hhhL) iӭ'խMDqD):} `ө8өө<`@)ө '''' ED  hhhL) iӭ'խMDqD)8&; SYSTEXT;PRINTS: MACRO ADDRESS LDA #HIGH %1 STA ICBAH LDA #LOW %1 STA ICBAL>} JSR PUTRECENDM;INTS: MACRO ADDRESS LDA #HIGH %1 STA ICBAH LDA #LOW %1 STA ICBAL<; TRANSMIT;; A program to send DOS binary load; files from one ATARI 800 to another; using the JOYSTICK port.;B}; Nick Kennedy;; 12/22/86;; System Equates:;CH: EQU $2FC ; Keyboard code hereCIOV: EQU $E456ICCB}OM: EQU $342ICSTA: EQU $343ICBAL: EQU $344ICBAH: EQU $345ICBLL: EQU $348ICBLH: EQU $349ICAX1: EQU $34ARTCLOK: EB}QU $14BEEP: EQU $FDCONSOL: EQU $D01F; ORG $4000 JMP INITLOADL: DS 1LOADH: DS 1ENDL: DS 1ENDH: B}DS 1PLACE: DS 1EOFF: DS 1 ; EOF FlagFLAG: DS 1 ;;; STRINGS:SEGMES: DB 'SEGMENT SENT/READY RCVD',$9BCIOB }E: DB 'ERROR IN GETFB Y=$605',$9BKYBD: DB 'K:'PMPT1: DB 'Awaiting filespec from receiver:',$9BBSTMSG: DB 'Bad status B }on opening file.', $9BNTLF: DB 'Header error - not a load file.', $9B;;; INITIALIZE;INIT: LDA #$9B B } JSR PUTBYT LDA #$9B JSR PUTBYT PRINTS PMPT1 LDA #$9B JSR PUTBYT;; Get the filesB }pec from the other 800; PROC JSR RINIT LDY #0:GET1: JSR RLOOP ; Get filespec byte STA RECOB }RD,Y ; store it INY CMP #$9B ; EOR? BNE :GET1 ; No.;; Put the filespec to the screen; LDA B}#LOW RECORD STA ICBAL LDA #HIGH RECORD STA ICBAH JSR PUTREC JSR TINIT ; To send statuB}s.;; Now, open the file for input:; Use IOCB #1; LDX #$10 LDA #$C STA ICCOM,X ; First close it B} JSR CIOV LDA #3 STA ICCOM,X LDA #HIGH RECORD STA ICBAH,X LDA #LOW RECORD B} STA ICBAL,X LDA #4 STA ICAX1,X JSR CIOV ; Open it. BPL :NOERR PRINTS BSTMSG ; Bad B}open stat LDA #0 JSR TLOOP ; Send badstat JSR INIT ; Start over:NOERR: LDA #$FF ; Send goodstatus B} JSR TLOOP; JSR GETFB ; Get file byte. PHA ; Stash byte JSR TLOOP ; Send it PLA B} CMP #$FF BNE :BADHD JSR GETFB PHA JSR TLOOP PLA CMP #$FF BEQ :GOODHDB}:BADHD: PRINTS NTLF ; Not load file JMP INIT;; Get/Send Load/End addresses:;:GOODHD JSR GETFB:GDHD1: STA LOADLB} JSR TLOOP JSR GETFB:GDHD2: STA LOADH JSR TLOOP JSR GETFB STA ENDL JSR TLOOPB} JSR GETFB STA ENDH JSR TLOOP;; Now send the file bytes:;:SLOOP: JSR GETFB STY EOFF ; EOF B}Flag JSR TLOOP;; Now, is LOAD=END?; LDA LOADH CMP ENDH BNE :NTDUN LDA LOADL B} CMP ENDL BNE :NTDUN JMP :SEGDUN ; Load = End.:NTDUN: INC LOADL BNE :NOMO INC LOADH:NOMO: B} JMP :SLOOP ; Get/Send next.;; Receive ready code from RECEIVER:;:SEGDUN JSR RINIT JSR RLOOP ; Any byte receivedB} PRINTS SEGMES ;************** JSR TINIT ; means ready JSR JIF2 ; Waste jiffy or 2;; Now, are we at B}the EOF?; LDA EOFF ; Status byte CMP #3 ; 3 = impending EOF. BNE :NOEOF LDA #0 ; Indicates EB}OF JSR TLOOP ; Tell receiver. LDA #$C ; Close file. LDX #$10 STA ICCOM,X JSR CIOV B} RTS ; Back to DOS;; Now, next two bytes may or may not; be $FFFF header (optional).;:NOEOF: LDA #$FF ; =Not EOF staB}tus JSR TLOOP JSR GETFB CMP #$FF BNE :NOHDR JSR GETFB CMP #$FF BNE :OB }HNO JSR GETFB ; Header was $FFFF:NOHDR: JMP :GDHD1:OHNO: PHA ; Stash 2nd byte LDA #$FF ; 1st was $FF B!} STA LOADL JSR TLOOP PLA JMP :GDHD2 ; Whew!;EPROC;; GET FILE BYTE:;GETFB: LDX #$10 B"}LDA #0 STA ICBLL,X STA ICBLH,X LDA #7 STA ICCOM,X JSR CIOV BMI ERROR;********B#}*********** RTSERROR: STY $605 PRINTS CIOE ;**************** PLA ;************ PLA ;*******B$}***** RTS; JIF2: Stall 2 jiffies waiting to; be sure the other guy gets into; receive mode.;JIF2: LDA RTCLOK B%} STA PLACE INC PLACE INC PLACEJIF2A: LDA RTCLOK CMP PLACE BNE JIF2A RTS;JIFB&}10: LDA RTCLOK ADC #$A STA PLACEJIF10A: LDA RTCLOK CMP PLACE BNE JIF10A RTS;; SubB'}routine to put record to E:; (Have ICBAH/L loaded before entry); (Use MACRO PRINTS);PUTREC: LDA #$80 STA ICBLL B(} LDX #0 STX ICBLH LDA #9 ; Put record. STA ICCOM JSR CIOV RTS;; Subroutine to B)}get a record from #0; User set ICBAL/H.;GETREC: LDX #0 LDA #5 STA ICCOM LDA #$80 STA ICBLLB*} STX ICBLH JSR CIOV RTS;;; Subroutine to put byte to E:; (Have byte in accumulator on entry);PUB+}TBYT: LDX #$B ; Put byte STX ICCOM LDX #0 STX ICBLH STX ICBLL JSR CIOV RTS;B,};; A routine to get one byte from ; IOCB #0 (assumed to be E:):;GETBYT: LDX #0 STX ICBLL STX ICBLH B-} LDA #7 STA ICCOM ; Get bytes. JSR CIOV RTS;;; The following is the transmit/; receive portion oB.}f TALKP.;; System Equates:PACTL: EQU $D302;CTLRW: EQU %00111100 ; to R/W portCTLDD: EQU %00111000 ; to write data; B/}direction. (0=input; 1=output);PORTA: EQU $D300;; For STICK 0, bits 0-3 equal pins; 1-4. (8 is ground);; PINS:;;B0}; 1 2 3 4 5 ; View of jack on; 6 7 8 9 ; console.;; NOTES:;; Pin 1 is data.; Pin 2 is Transmitter status.; (DAB1}TA READY or DR) (0 = READY).; Pin 3 is Receiver status.; (RECEIVER READY or RR) (0 = READY).;; Initialization: Before eacB2}h byte; sent/received all out lines are ; made high. Transmitter makes sure; RR is high, then sets DATA lo. ; Receiver waB3}tches for DR high AND; Data lo, then is freed to set RR; lo (ready). Transmitter is then; free to put data and set DR lo (B4}rdy);;;TIMER: DS 1 ; My timeout timerDATA DS 1 ; Store/send byte hereBITCT: DS 1 ; Bit counter;; STRIB5}NGS:TOM: DB 'TIMED OUT DURING BYTE TRANSFER', $9B;; INITIALIZE;;RINIT: LDA #$FF ; Not ready. STAB6} PORTA LDA #$9B JSR PUTBYT LDA #LOW CTLDD ; Make PORTA STA PACTL ; be data direction B7}LDA #%00000100 ; register. STA PORTA ; Made bit 2 input. LDA #LOW CTLRW ; Make PORTA STA PACTL ; be IB8}/O port again RTS;; This subroutine receives a byte:;RLOOP: LDA PORTA ; XMT initialized? AND #3 ; Get biB9}ts 0 and 1 CMP #2 ; Data LO & DR HI? BNE RLOOP ; Keep checking LDA #7 ; Bit counter (0-7) STAB:} BITCTRLP3: LDA #$FF - 4 ; clear bit 2 STA PORTA ; (set RR ready)RLP1: LDA BITCT ; We don't time out CMB;}P #7 ; if waiting for the BEQ SEVEN ; first bit. LDA RTCLOK ; But check on CMP TIMER ; later bits B<} BNE NOTO ; No timeoutGOON: PRINTS TOM ; timeout message PLA ; Clear return address PLA ; from stack.B=} JMP INIT ; Goto menuSEVEN: LDA RTCLOK ; Set up timer for STA TIMER ; one to two jiff's INC TIMER B>} INC TIMERNOTO: LDA PORTA ; check DR AND #2 ; Mask all but DR line BNE RLP1 ; DATA not ready B?}ASL DATA LDA PORTA ; Read data AND #1 ; Mask non-data CLC ADC DATA ; add it to DATA SB@}TA DATA LDA #$0F STA PORTA ; RR not readyRLP2: LDA TIMER CMP RTCLOK BEQ GOON ; Go on. (exBA}it) LDA PORTA ; Check for DR not. AND #2 BEQ RLP2 ; DR not set DEC BITCT ; Next bit BBB}PL RLP3 ; Do 8 bits LDA DATA ; Take it home RTS;;; This subroutine sends a byte out; over the PIA line:;BC}TLOOP: STA DATA ; Store the byteTLP4: LDA PORTA ; Check rcvr status AND #4 BEQ TLP4 ; Loop if ready. BD} LDA #2 ; Set DR=1, DATA=0 STA PORTA LDA #7 ; Bit counter STA BITCT ; initialize LDA RBE}TCLOK STA TIMER INC TIMER INC TIMERTLP1: LDA RTCLOK ; Check for time CMP TIMER ;waiting foBF}r RR. BNE TLP5 ; No timeoutTGOON: PRINTS TOM ; timeout message PLA ; Clear return address PLA ; froBG}m stack. PLA ; Also clear data byte. JMP INIT ; Goto menuTLP5: LDA PORTA ; Receiver ready? AND #4 BH}; Bit 2 is RR line BNE TLP1 ; Not ready ASL DATA ; Knock left bit LDA #0 ; Into carry ADC #0 BI}; add carry to 0 STA PORTA ; Put data/DR readyTLP2: LDA TIMER CMP RTCLOK BEQ TGOON ; Timed out BJ} LDA PORTA ; RCVR accept data? AND #4 ; RR line set? BEQ TLP2 ; Not yet LDA #$0F ; Data not readyBK}. STA PORTA ; Tell RCVR DEC BITCT ; Count the bit BPL TLP1 ; 8 bits sent? RTS;; TRANSMIT sBL}ection follows:;TINIT: LDA #$0F ; Not ready/Not init STA PORTA LDA #LOW CTLDD STA PACTL ; Data dirBM}ection LDA #%00000011 STA PORTA LDA #LOW CTLRW STA PACTL ; Data register RTS;; RECBN}ORD is where I input my filename; It takes no file space cause it's ; at the end;RECORD: END INITer RTS;; REC@f ATARICOM.DOC by Nick Kennedy NOTE TO SIO2PC USERS: What is this ATARICOM.ATR disk image and why do I needFP} it? You don't. But I mentioned in my SIO2PC info that I had tied two Atari's together via SIO ports and via joystick portFQ}s, and someone asked me how I did it. So, for those who are interested, here are the programs, the source code, and the whoFR}le exciting story: This DOC describes some Atari communications programs I wrote, which were sort of forerunners of SIO2PFS}C, for Atari to Atari file transfers. The idea was, I had one Atari with a disk drive and one without. I wrote a pair of pFT}rograms, the "transmitter" program ran on the Atari with the disk drive and was called XMTSIO or XMTPIA. The "receive" progFU}ram was designed to run from a cassette on the Atari without the disk drive. With the correct hook-up, the diskless Atari coFV}uld request files from the Atari with a drive, which would transmit them. The reveive programs were called RCVSIO and RCVPFW}IA. When run, these programs actually put the "real" receive program to a cassette boot file. There were also demonstratiFX}on programs I called "intercom" programs, which allowed two people to talk to each other, teletype style, over their atariFY}'s. These two programs are called TALKSIO and TALKPIA. I did two versions of these programs. The first version communicatFZ}ed via the serial bus (SIO). It worked pretty well, but occasionally would lock up via an unidentifiable bug. Also, it was F[}a pain to unplug the cassette cord and plug in the communications link cable. So the next version used the joystick ports (F\}PIA lines) in an unclocked, fully handshaking protocall I made up myself. This version worked flawlessly. Following are sF]}ome excerpts from my source code which told what the programs did and how the computers were to be hooked up: FROM TALKSIF^}O.SOR: TALK ; ; Nick Kennedy ; ; 10-29-86 ; ; An experiment with the serial bus ; whichF_} will send characters between ; two Atari 800 computers using the ; serial port, but not using SIO.; Note: when I said F`}"not using SIO," I mean I didn't use the Atari OS's routines to send the data, since they are device specific and send in fFa}ixed length blocks. I addressed the POKEY chip directly and sent one byte at a time. Also, I started out at 600 baud, but whFb}en that was ok, I changed the program to run at 19,200. I never had trouble (or did I?) even though I had about 75-100 feetFc} of unshielded telephone wire between my Atari's. FROM XMTSIO.SOR: ; TRANSMIT ; ; A program to send DOFd}S binary load ; files from one ATARI 800 to another ; using the SERIAL port. For ground, ; connect the pins # 6 and/or 4 Fe} ; together (via cord/connector). For ; data, connect pin 3 on computer A ; to 5 on computer B, and vice versa. ; 4 condFf}uctor phone cord is ok here. ; ; ; Nick Kennedy ; ; 11/21/86 Note, here's what the SIO jack on the AtFg}ari looks like for pin-out: 2 4 6 8 10 12 1 3 5 7 9 11 13 FROM RCVSIO.SOR: ; RECEIVE ; ; NFh}ick Kennedy ; ; 11/15/86 ; ; This program is intended to receive ; and run binary files via the serial ; inputFi} port. ; ; This part of the program creates ; the cassette boot file. FROM TALKPIA.SOR: ; TALKP ; ; Fj} Nick Kennedy ; ; A program to send data between two ; Atari 800 computers using the PIA's ; (joystick ports). ; ; Fk} ; For STICK 0, bits 0-3 equal pins ; 1-4. (8 is ground) ; ; PINS: ; ; ; 1 2 3 4 5 ; View of jack on ; 6 7 8 9 Fl} ; console. ; ; NOTES: ; ; Pin 1 is data. ; Pin 2 is Transmitter status. ; (DATA READY or DR) (0 = READY). ; Pin 3 iFm}s Receiver status. ; (RECEIVER READY or RR) (0 = READY). ; ; Initialization: Before each byte ; sent/received all out linFn}es are ; made high. Transmitter makes sure ; RR is high, then sets DATA lo. ; Receiver watches for DR high AND ; Data lFo}o, then is freed to set RR ; lo (ready). Transmitter is then ; free to put data and set DR lo (rdy) FROM RCVPIA.SOR: Fp}; RECEIVE ; ; Nick Kennedy ; ; 11/15/86 ; ; This program is intended to receive ; and run biFq}nary files via the ; joystick (PIA) port. ; ; This part of the program creates ; the cassette boot file. FROM XMTPIAFr}.SOR: ; TRANSMIT ; ; A program to send DOS binary load ; files from one ATARI 800 to another ; using the JOYSFs}TICK port. ; ; Nick Kennedy ; ; 12/22/86 OK. I had hoped that one of those told exactly how to intercoFt}nnect the two computers via joysticks. But I'm pretty sure it's like this: Use stick 0 (the first joystick port) pin 1Fu} to pin 1 pin 2 to pin 2 pin 3 to pin 3 pin 8 to pin 8 You can use connectors from dead joysticks for this purpose. Fv}I consider all these programs to be "public domain." You can use them, give them away, modify them at will. You can have theFw} source code as well as the executable OBJ files. The source code was written for Atari's AMAC assembler. It's a good assemFx}bler when used with a ramdisk, but too slow for use with a real disk drive. (SIO2PC falls somewhere in between.) Oh yeah, wFy}hen using the intercom (TALK) programs, the transmitting station must press control-A to give the other station the opportunFz}ity to send. COMMENTS? The author is: Nick Kennedy 300 South Vancouver Russellville, AR 72801 F{}to send. COMMENTS? The author is: Nick Kennedy 300 South Vancouver Russellville, AR 72801 DHIED BɛH V ` ΊҬɛ L`󩫅 ذW ݢ (۰H ٰCԥԍ TUJ}}HIED BɛH V `Ȑɛ ΊҬɛ LL%󩫅 ذG ٥@